2. Parámetros de ecuaciones de estado cúbicas (SRK, PR, RKPR)

En esta sección se presenta una implementación en Python para calcular los parámetros de ecuaciones de estado cúbicas (SRK, PR, RKPR). Las 2 primeras ecuaciónes de estado SRK y PR, son ecuaciones clásicas y ampliamente utilizadas por la industria y la academia que cuentan con 2 parámetros (parámetro de atracción $a_C$ y de repulsión $b$) para describir el comportamiento de sustancias. Por otro lado, la ecuación de estado RKPR, la cual es una propuesta de una ecuación con un tercer parámetro $\delta_1$,el cual permite incluir el efecto estructural de la molécula de la sustancia a la que se quiere describir su comportamiento termodinámico.

2.1 Ecuaciones de estado: SRK y PR

Como se mncionó anteriormente en el caso de las ecuaciones de estado (SRK y PR) se tienen los parámetro de atracción $a_C$ y de repulsión $b$ que pueden ser calculados por medio de expresiones que relacionan constantes como temperatura crítica $T_c$, presión crítica $P_c$, volumen crítico $V_c$ y factor acéntrico $\omega$ de una sustancia pura ademas de la constate universal de los gases R.

2.1.1 Especificación de las constantes: $T_c$, $P_c$, $V_c$ y $\omega$

En el caso de especificar las constantes $T_c$, $P_c$, $V_c$ y $\omega$, es simple calcular los parámetros $a_c$, $b$ y $m$ por medio de las siguientes ecuaciones:

Parámetros Ecuación de estado SRK Parámetros Ecuación de estado PR
$ a_c = 0.077796070 \frac{R^2 T_c^2} {P_c}$ $ a_c = 0.45723553 \frac{R^2 T_c^2} {P_c} $
$ b_c = 0.086640 \frac{ R T_c} {P_c}$ $ b_c = 0.077796070 \frac{R T_c} {P_c} $
$ m = 0.480 + 1.574 \omega - 0.175 \omega^2$ $m = 0.37464 + 1.54226 \omega - 0.26992 \omega ^2$

2.1.2 Especificación de los parámetros: $a_c$, $b$ y $m$

Ahora en el caso realizar una especificación para los valores de los parámetro de atracción $a_C$, de repulsión $b$ y $m$ para una sustancia pura, es simple obtener los valores correspondientes de las constantes $T_c$, $P_c$, $V_c$ y $\omega$

$$ T_c = \frac{\omega_b a_c} {\omega_a R b} $$$$ P_c = \frac{\omega_b R T_c} {b} $$$$ V_c = \frac{Z_c R T_c} {P_c} $$

En el caso del $ \omega$, se debe resolver una ecuación cuadratica que depende de unos determinados valores de constantes $c$, del parámetro $\delta_1$ y el parámetro $m$, que toman determinados valores para casa ecuación de estado:

$$ \omega = 0.5 \frac{- c_2 + \sqrt{c_2^2 - 4 c_1 c_3}}{2c_1} $$
Ecuación de estado SRK Ecuación de estado PR
$\delta_1 = 1.0$ $\delta_1 = 1.0 + \sqrt{2.0}$
$c_1 = -0.175$ $c_1 = -0.26992$
$c_2 = 1.574$ $c_2 = 1.54226$
$c_3 = 0.48 - m$ $c_3 = 0.37464 - m$

2.2 Ecuación de estado RKPR

En el caso de la ecuación de estado RKPR, se tiene una posibilidad adicional por medio de utilizar el parámetro estructural $\delta_1$ para correlacionar el valor del factor de compresibilidad $Z_c$ con el támaño de la molécula de la sustancia pura que se está tratando. De esta forma, a las especificaciones que se pueden hacer con las ecuaciones de estado (SRK y PR), como en el caso de especificar las constantes como temperatura crítica $T_c$, presión crítica $P_c$, volumen crítico $V_c$ y factor acéntrico $\omega$ de una sustancia pura, se tiene 3 posibles situaciones adicionales:

  1. La primera especificación corresponde a un valor del factor de compresibilidad crítico $Z_c$ y luego determinar el valor del parámetro $\delta_1$ que cumple con dicha especificación. Después se procede con el cálculo del parámetro $k$.

  2. La segunda especificación corresponde a un valor del parámetro $\delta_1$ para el posterior cálculo del parámetro $k$.

  3. La tercera opción es utilizar una correlación termodinámica para obtener un valor de la densidad de líquido saturado de una sustancia pura $\rho(T)_{sat}^{liq}$ y pasarlo como una especificación, para encontrar un valor de los parámetros $\delta_1$ y $k$, que cumplan con la imposición del valor de la densidad de líquido saturado.

            Figura 1. Diagrama conceptual del calculo de parámetros ecuación RKPR

En la figura 1, los casos de Mode = 1, 2 y 3 corresponden a especificar las constantes ($T_c$, $P_c$, $\omega$) + alguna de las variables ($V_c$, $\delta_1$ , $\rho(T)_{sat}^{liq}$), mientras que el Mode = 4 se refiere a la especificación de los parámetros ($a_c$, $b$, $k$, $\delta_1$) y obtener el valor de las constantes ($T_c$, $P_c$, $V_c$, $\omega$). Este último cálculo se realiza de forma directa como en el caso de las ecuaciones (SRK y PR), por tanto, la siguiente breve explicación se centra en las 3 primeras opciones.

2.2.1 Especificación del parametro $\delta_1 $

La primera especificación corresponde a dar un valor del parámetro $\delta_1$, con est valor se calcula el factor de compresiblidad $Z_c$ por mediod e las siguientes ecuaciones:

$$d_1 = (1 + \delta_1 ^2) / (1 + \delta_1)$$$$y = 1 + (2 (1 + \delta_1) ^ \frac{1} {3} + \left (\frac{4} {1 + \delta_1} \right)^ \frac{1} {3}$$$$ \omega_a = \frac{(3 y ^2 + 3 y d_1 + d_1 ^ 2 + d_1 - 1)} {(3 y + d_1 - 1) ^ 2} $$$$ \omega_b = \frac{1} {3 y + d_1 - 1} $$$$ Z_c = \frac{y} {3 y + d_1 - 1} $$

en $A_0$

factor de compresibilidad crítico $Z_c$, determinado por las constantes ($T_c$, $P_c$, $V_c$):

$$ Z_c = \frac{P_c V_c}{R T_c}$$

para el posterior cálculo del parámetro $k$.

2.2.2 Especificación de las constantes: $T_c$, $P_c$, $V_c$ y $\omega$

La segunda especificación corresponde a un valor del factor de compresibilidad crítico $Z_c$, determinado por las constantes ($T_c$, $P_c$, $V_c$):

$$ Z_c = \frac{P_c V_c}{R T_c}$$

que para luego determinar el correspondiente valor del parámetro d1 que cumple con dicha especificación. Después se procede con el cálculo del parámetro k.

2.2.3 Especificación de un valor de densidad de líqudo saturado $\rho(T)_{sat}^{liq}$

La tercera opción es la especificación de un valor para la densidad de líquido saturado a una temperatura. En este caso se debe encontrar un valor d1 y el correspondiente valor del parámetro k, que permita cumplir con la imposición del valor de la densidad de líquido saturado. En este caso, se puede utilizar la clase Thermodynamic_correlations() para obtener un valor para la densidad de líquido saturado de una sustancia pura a una determinada temperatura y luego pasar este valor, como una especificación en la obtención de los parámetros de la ecuación RKPR.

En la figura 4 se muestran como variables de entrada las constantes Tc,Pc, w y alfa que puede ser una especificación de alguno de los 3 parámetros siguientes $(\delta_1, V_c, \rho(T)_{sat}^{liq})$.

La función F1 corresponde a la estimación de un valor para el parámetro {d1} de acuerdo a una correlación preestablecida en el caso de {alfa = Vc}.

La función F2 es el cálculo de los parámetros {ac} y {b} para el correspondiente valor del parámetro {d1}. En el caso de especificar el parámetro {alfa=d1}, el cálculo de los parámetros Zc, ac y b son directos y no requieren de iteración. Mientras que en el caso de alfa = {Vc} se requiere encontrar de forma iterativa el valor del parámetro d1 que verifique el valor de Zc correspondiente por medio del Vc previamente especificado. De manera similar se procede en el caso de {alfa = rho(T)_sat_liq}.

2.2.4 Especificación de los parámetros: $a_c, b, k, \delta_1$

En los ejemplos siguientes se utilizan los datos termodísicos de la base de datos DPPR. Para el caso se tiene como especificación la ecuación de estado RKPR y las constantes criticas para el componente 3-METHYLHEPTANE.

2.3


In [1]:
import numpy as np
import pandas as pd
import pyther as pt

importar las linrerías requeridas, en este caso se trata de las librerías numpy, pandas junto con pyther


In [3]:
properties_data = pt.Data_parse()

component = "3-METHYLHEPTANE"
component = "METHANE"
component = "ETHANE"
component = "PROPANE"
component = "n-HEXATRIACONTANE"

NMODEL = "RKPR"
NMODEL = "PR"
ICALC = "constants_eps"

properties_component = properties_data.selec_component(component)
pt.print_properties_component(component, properties_component)
dinputs = np.array([properties_component[1]['Tc'], properties_component[1]['Pc'],
                    properties_component[1]['Omega'], properties_component[1]['Vc']])

component_eos = pt.models_eos_cal(NMODEL, ICALC, dinputs)

#ac = component_eos[0]
print(component_eos)


Component = n-HEXATRIACONTANE
Acentric_factor = 1.526
Critical_Temperature = 874 K
Critical_Pressure = 6.711 Bar
Critical_Volume = 2.09 cm3/mol
Compressibility_factor_Z = 0.196


The NMODEL is eos_PR and method ICALC is constants_eps
params = [ac, b, rm, del1]
[359.78656827704333, 0.84239649103360315, 2.0995725340799996, 2.4142135623730949]

In [6]:
components = ["ISOBUTANE", "CARBON DIOXIDE", 'METHANE', "ETHANE", "3-METHYLHEPTANE", "n-PENTACOSANE",
              "NAPHTHALENE", "m-ETHYLTOLUENE", "2-METHYL-1-HEXENE"]

NMODEL = "PR"
ICALC = "constants_eps"
component_eos_list = np.zeros((len(components),4))

for index, component in enumerate(components):
    
    properties_component = properties_data.selec_component(component)
    #pt.print_properties_component(component, properties_component)
    dinputs = np.array([properties_component[1]['Tc'], properties_component[1]['Pc'],
                        properties_component[1]['Omega'], properties_component[1]['Vc']])
    
    component_eos = pt.models_eos_cal(NMODEL, ICALC, dinputs)
    component_eos_list[index] = component_eos 
    
#components_table_PR = pd.DataFrame(component_eos_list, index=components, columns=['ac', 'b', 'rm', 'del1'])
#print(components_table_PR)


The NMODEL is eos_PR and method ICALC is constants_eps
params = [ac, b, rm, del1]
The NMODEL is eos_PR and method ICALC is constants_eps
params = [ac, b, rm, del1]
The NMODEL is eos_PR and method ICALC is constants_eps
params = [ac, b, rm, del1]
The NMODEL is eos_PR and method ICALC is constants_eps
params = [ac, b, rm, del1]
The NMODEL is eos_PR and method ICALC is constants_eps
params = [ac, b, rm, del1]
The NMODEL is eos_PR and method ICALC is constants_eps
params = [ac, b, rm, del1]
The NMODEL is eos_PR and method ICALC is constants_eps
params = [ac, b, rm, del1]
The NMODEL is eos_PR and method ICALC is constants_eps
params = [ac, b, rm, del1]
The NMODEL is eos_PR and method ICALC is constants_eps
params = [ac, b, rm, del1]
                           ac         b        rm      del1
ISOBUTANE           14.624767  0.073327  0.644657  2.414214
CARBON DIOXIDE       4.014554  0.027005  0.705994  2.414214
METHANE              2.528951  0.027157  0.392340  2.414214
ETHANE               6.128134  0.041073  0.525423  2.414214
3-METHYLHEPTANE     39.968562  0.145103  0.910740  2.414214
n-PENTACOSANE      222.281736  0.560184  1.749542  2.414214
NAPHTHALENE         44.276783  0.121075  0.816061  2.414214
m-ETHYLTOLUENE      45.780981  0.147037  0.844082  2.414214
2-METHYL-1-HEXENE   32.300106  0.122858  0.825976  2.414214

In [7]:
components_table_PR = pd.DataFrame(component_eos_list, index=components, columns=['ac', 'b', 'rm', 'del1'])
print(components_table_PR)

components_table_PR


                           ac         b        rm      del1
ISOBUTANE           14.624767  0.073327  0.644657  2.414214
CARBON DIOXIDE       4.014554  0.027005  0.705994  2.414214
METHANE              2.528951  0.027157  0.392340  2.414214
ETHANE               6.128134  0.041073  0.525423  2.414214
3-METHYLHEPTANE     39.968562  0.145103  0.910740  2.414214
n-PENTACOSANE      222.281736  0.560184  1.749542  2.414214
NAPHTHALENE         44.276783  0.121075  0.816061  2.414214
m-ETHYLTOLUENE      45.780981  0.147037  0.844082  2.414214
2-METHYL-1-HEXENE   32.300106  0.122858  0.825976  2.414214
Out[7]:
ac b rm del1
ISOBUTANE 14.624767 0.073327 0.644657 2.414214
CARBON DIOXIDE 4.014554 0.027005 0.705994 2.414214
METHANE 2.528951 0.027157 0.392340 2.414214
ETHANE 6.128134 0.041073 0.525423 2.414214
3-METHYLHEPTANE 39.968562 0.145103 0.910740 2.414214
n-PENTACOSANE 222.281736 0.560184 1.749542 2.414214
NAPHTHALENE 44.276783 0.121075 0.816061 2.414214
m-ETHYLTOLUENE 45.780981 0.147037 0.844082 2.414214
2-METHYL-1-HEXENE 32.300106 0.122858 0.825976 2.414214

In [12]:
name = properties_data.read_dppr()[0]
name


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-5882b6790076> in <module>()
----> 1 name = properties_data.read_dppr()[0]
      2 name

TypeError: read_dppr() missing 1 required positional argument: 'dppr_file'

In [ ]:


In [ ]:

De esta forma se observa el calculo simple de los parámetros para la sustancia pura 3-METHYLHEPTANE_RKPR

A continuación se realiza el mismo tipo de calculo pero tomando una serie de 9 sustancias puras, que se pueden extender facilmente a n sustancias, para obtener sus parámetros de nuevo con la ecuación de estado RKPR.


In [3]:
properties_data = pt.Data_parse()

components = ["ISOBUTANE", "CARBON DIOXIDE", 'METHANE', "ETHANE", "3-METHYLHEPTANE", "n-PENTACOSANE",
              "NAPHTHALENE", "m-ETHYLTOLUENE", "2-METHYL-1-HEXENE"]

NMODEL = "RKPR"
ICALC = "constants_eps"
component_eos_list = np.zeros((len(components),4))

for index, component in enumerate(components):
    
    properties_component = properties_data.selec_component(component)
    pt.print_properties_component(component, properties_component)
    dinputs = np.array([properties_component[1]['Tc'], properties_component[1]['Pc'],
                        properties_component[1]['Omega'], properties_component[1]['Vc']])
    
    component_eos = pt.models_eos_cal(NMODEL, ICALC, dinputs)
    component_eos_list[index] = component_eos 
    
components_table = pd.DataFrame(component_eos_list, index=components, columns=['ac', 'b', 'rm', 'del1'])

print(components_table)


Component = ISOBUTANE
Acentric_factor = 0.18080000000000002
Critical_Temperature = 408.14 K
Critical_Pressure = 36.003 Bar
Critical_Volume = 0.2627 cm3/mol
Compressibility_factor_Z = 0.28200000000000003


del1ini = 3.9722378008963446
Zc = 0.27871152548257544
The NMODEL is eos_RKPR and method ICALC is constants_eps
params = [ac, b, rm, del1]
Component = CARBON DIOXIDE
Acentric_factor = 0.22360000000000002
Critical_Temperature = 304.21 K
Critical_Pressure = 72.865 Bar
Critical_Volume = 0.094 cm3/mol
Compressibility_factor_Z = 0.274


del1ini = 4.462908059336361
Zc = 0.2707937660977233
The NMODEL is eos_RKPR and method ICALC is constants_eps
params = [ac, b, rm, del1]
Component = METHANE
Acentric_factor = 0.0115
Critical_Temperature = 190.564 K
Critical_Pressure = 45.389 Bar
Critical_Volume = 0.09860000000000001 cm3/mol
Compressibility_factor_Z = 0.28600000000000003


del1ini = 3.7519407434981633
Zc = 0.2824567739174239
The NMODEL is eos_RKPR and method ICALC is constants_eps
params = [ac, b, rm, del1]
Component = ETHANE
Acentric_factor = 0.0995
Critical_Temperature = 305.32 K
Critical_Pressure = 48.083 Bar
Critical_Volume = 0.14550000000000002 cm3/mol
Compressibility_factor_Z = 0.279


del1ini = 4.161423913263858
Zc = 0.2755907402334964
The NMODEL is eos_RKPR and method ICALC is constants_eps
params = [ac, b, rm, del1]
Component = 3-METHYLHEPTANE
Acentric_factor = 0.3718
Critical_Temperature = 563.67 K
Critical_Pressure = 25.127 Bar
Critical_Volume = 0.464 cm3/mol
Compressibility_factor_Z = 0.252


del1ini = 6.038268203938681
Zc = 0.24877058378575795
The NMODEL is eos_RKPR and method ICALC is constants_eps
params = [ac, b, rm, del1]
Component = n-PENTACOSANE
Acentric_factor = 1.1053
Critical_Temperature = 812 K
Critical_Pressure = 9.376 Bar
Critical_Volume = 1.46 cm3/mol
Compressibility_factor_Z = 0.20500000000000002


del1ini = 10.600246415857843
Zc = 0.20275882073834256
/home/andres-python/Documentos/proyectos/pyther/pyther/cubic_parameters_1.py:86: RuntimeWarning: invalid value encountered in log
  AT = F - np.log(Volume) + Volume * P_sur / (T * RGAS)
The NMODEL is eos_RKPR and method ICALC is constants_eps
params = [ac, b, rm, del1]
Component = NAPHTHALENE
Acentric_factor = 0.3022
Critical_Temperature = 748.35 K
Critical_Pressure = 39.98 Bar
Critical_Volume = 0.41300000000000003 cm3/mol
Compressibility_factor_Z = 0.269


del1ini = 4.8204311891035925
Zc = 0.2653709654843225
The NMODEL is eos_RKPR and method ICALC is constants_eps
params = [ac, b, rm, del1]
Component = m-ETHYLTOLUENE
Acentric_factor = 0.3226
Critical_Temperature = 637.15 K
Critical_Pressure = 28.029 Bar
Critical_Volume = 0.49 cm3/mol
Compressibility_factor_Z = 0.263


del1ini = 5.246526144851435
Zc = 0.2592551086535563
The NMODEL is eos_RKPR and method ICALC is constants_eps
params = [ac, b, rm, del1]
Component = 2-METHYL-1-HEXENE
Acentric_factor = 0.3094
Critical_Temperature = 538 K
Critical_Pressure = 28.325 Bar
Critical_Volume = 0.398 cm3/mol
Compressibility_factor_Z = 0.255


del1ini = 5.784189965441039
Zc = 0.2520206003977051
The NMODEL is eos_RKPR and method ICALC is constants_eps
params = [ac, b, rm, del1]
                           ac         b        rm       del1
ISOBUTANE           15.743219  0.064343  2.205509   4.000470
CARBON DIOXIDE       4.409808  0.022801  2.280728   4.492210
METHANE              2.696405  0.024259  1.282178   3.777713
ETHANE               6.649597  0.035503  1.673541   4.190762
3-METHYLHEPTANE     46.430579  0.109351  2.586092   6.043125
n-PENTACOSANE      289.947431  0.320522  4.581358  10.628260
NAPHTHALENE         49.312554  0.099495  2.591582   4.847168
m-ETHYLTOLUENE      51.786960  0.117115  2.565531   5.267361
2-METHYL-1-HEXENE   37.214555  0.094214  2.338038   5.794610

Como se observa, los resultados obtenidos son organizados en un DataFrame permitiendo agilizar la manipulación de los datos de una serie de sustancias puras.


In [8]:
components_table


Out[8]:
ac b rm del1
ISOBUTANE 15.743219 0.064343 2.205509 4.000470
CARBON DIOXIDE 4.409808 0.022801 2.280728 4.492210
METHANE 2.696405 0.024259 1.282178 3.777713
ETHANE 6.649597 0.035503 1.673541 4.190762
3-METHYLHEPTANE 46.430579 0.109351 2.586092 6.043125
n-PENTACOSANE 289.947431 0.320522 4.581358 10.628260
NAPHTHALENE 49.312554 0.099495 2.591582 4.847168
m-ETHYLTOLUENE 51.786960 0.117115 2.565531 5.267361
2-METHYL-1-HEXENE 37.214555 0.094214 2.338038 5.794610

En el siguiente ejemplo se utiliza la ecuación RKPR pero esta vez con la especificación de la temperatura y densidad de líquido saturado para el CARBON DIOXIDE y de esta forma encontrar el valor del parámetro delta que verifica la especificación realizada para la densidad de líquido saturado.


In [29]:
properties_data = pt.Data_parse()

dppr_file = "PureFull.xls"
component = "CARBON DIOXIDE"

NMODEL = "RKPR"
ICALC = "density"

properties_component = properties_data.selec_component(dppr_file, component)
pt.print_properties_component(component, properties_component)
#dinputs = np.array([properties_component[1]['Tc'], properties_component[1]['Pc'],
#                    properties_component[1]['Omega'], properties_component[1]['Vc']])

T_especific = 270.0
RHOLSat_esp = 21.4626
# valor initial of delta_1
delta_1 = 1.5

dinputs = np.array([properties_component[1]['Tc'], properties_component[1]['Pc'],
                    properties_component[1]['Omega'], delta_1, T_especific, RHOLSat_esp])


component_eos = pt.models_eos_cal(NMODEL, ICALC, dinputs)

print(component_eos)


Component = CARBON DIOXIDE
Acentric_factor = 0.22360000000000002
Critical_Temperature = 304.21 K
Critical_Pressure = 72.865 Bar
Critical_Volume = 0.094 cm3/mol
Compressibility_factor_Z = 0.274
The NMODEL is eos_RKPR and method ICALC is density
The parameter delta1(rho,T) = [ 2.65756708]
[ 2.65756708]

Bibliografía

  1. Martín Cismondi, Jørgen Mollerup. Development and application of a three-parameter RK–PR equation of state. Fluid Phase Equilibria. Volume 232, 25 May 2005, Pages 74-89